home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / tek / examples / subtask.c < prev    next >
C/C++ Source or Header  |  2001-05-12  |  1KB  |  80 lines

  1.  
  2. /*
  3. **    tek/examples/subtask.c
  4. **
  5. **    simple multitasking and messaging test.
  6. **    pass messages to a subtask, let it calculate something,
  7. **    and send replies back to the sender
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <tek/msg.h>
  12.  
  13.  
  14. void calcfunc(TAPTR task)
  15. {
  16.     TUINT signals;
  17.     TPORT *port = TTaskPort(task);
  18.     TUINT *msg;
  19.  
  20.     do
  21.     {
  22.         while ((msg = TGetMsg(port)))
  23.         {
  24.             *msg *= 2;
  25.             TReplyMsg(msg);
  26.         }
  27.     
  28.         signals = TWait(task, TTASK_SIG_ABORT | port->signal);
  29.     
  30.     } while (!(signals & TTASK_SIG_ABORT));
  31. }
  32.  
  33.  
  34. int main(int argc, char **argv)
  35. {
  36.     TAPTR basetask = TCreateTask(TNULL, TNULL, TNULL);
  37.     if (basetask)
  38.     {
  39.         TAPTR subtask = TCreateTask(basetask, calcfunc, TNULL);
  40.         if (subtask)
  41.         {
  42.             TPORT *port = TTaskPort(basetask);
  43.             TPORT *subport = TTaskPort(subtask);
  44.             TINT i;
  45.             TTIME t1, t2;
  46.             TUINT *msg;
  47.  
  48.             msg = TTaskAllocMsg(basetask, sizeof(TUINT));
  49.             if (msg)
  50.             {
  51.                 *msg = 1;
  52.     
  53.                 TTimeQuery(basetask, &t1);
  54.  
  55.                 for (i = 0; i < 20; ++i)
  56.                 {
  57.                     TPutReplyMsg(subport, port, msg);
  58.                     TWaitPort(port);
  59.                     TGetMsg(port);
  60.                     printf("%d\n", *msg); fflush(NULL);
  61.                 }
  62.                     
  63.                 TTimeQuery(basetask, &t2);
  64.     
  65.                 printf("time elapsed: %.5fs\n", TTIMETOF(&t2) - TTIMETOF(&t1)); fflush(NULL);
  66.  
  67.                 TFreeMsg(msg);
  68.             }
  69.     
  70.             TSignal(subtask, TTASK_SIG_ABORT);
  71.             
  72.             TDestroy(subtask);
  73.         }
  74.         
  75.         TDestroy(basetask);
  76.     }
  77.     
  78.     return 0;
  79. }
  80.